/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Estructuras;
import java.util.Observable;
import java.util.Observer;

/**
 *
 * @author Cesar Hernandez
 */
public class IO_struct implements Observer, Runnable{

    private Task_struct proceso;
    private int tiempo_restante; //Tiempo que le falta de IO a proceso.
    private Scheduler sched;

  public IO_struct(Scheduler scheduler) {
      this.proceso = null;
      this.sched = scheduler;
      tiempo_restante = -1;
  }

  public Task_struct getIOProcess(){

      return this.proceso;
  }


  //metodo que se ejecuta al momento de que el objeto observado cambie
  //o1 es el valor pasado por parametro en la this.notifyObservers
  public void update(Observable o, Object o1) {
     
      System.out.println("IO recibe señal");
      Thread hiloIO = new Thread(this);
      hiloIO.start();
     
  }

  /*
   * Una vez que se agoto el tiempo de IO, se procede a hacer runnable
   * de nuevo el proceso.
   */
  public void makeRunnable(Task_struct task){

    this.sched.enqueue_task(task);
    
  }

  // Metodo implementado de Runnable para que corra como Thread.
  
  public void run(){


        // Verifica si el IO esta libre, revisando la referencia al proceso
        // bloqueado principal (el que estaria usando el recurso).

      if (this.proceso == null){ //Esta libre

          if (sched.hasWaitProcess()){
            proceso = sched.nextWaitProcess();
            tiempo_restante = proceso.disminuirIO();
          }else{

              System.out.println("<<<<< IO OCIOSO >>>>>");
          }
      }


      // Verificamos que el tiempo de IO sea 0.
      // Si asi fuera, el proceso ya termino su uso de IO, sino
      // consume un tick de reloj

      if (tiempo_restante == 0){
        proceso.setState(Task_struct.READY);
        makeRunnable(this.proceso);
        proceso = null;
        tiempo_restante = -1;   // Se reinicializa el tiempo de IO, pues
                                // aun no sabe si tendra otro proceso para
                                // usar.
      }else if(tiempo_restante == -1){

          System.out.println("IO no ha sido usado por este tick");
      }
  }

}
